#include<bits/stdc++.h>
using namespace std;
struct ppp{
	int d,v,a;
};
ppp a[100005];
struct sss{
	int l,r;
};
sss c[100005];
int b[100005],s1,s2,t,n,m,L,V,w;
//bool bdx(sss x,sss y){
//	if(x.l>y.l||x.l==y.l&&x.l>y.l) return false;
//	return true;
//}
bool work(int mi,int mx){
	int md,l=1,r=m;
	while(l+1<r){
		md=(l+r)>>1;
		if(b[md]>=mi&&b[md]<=mx) return true;
		else if(b[md]>mx) r=md;
		else l=md;
	}
	return false;
}
int main(){
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
	int x;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d%d",&n,&m,&L,&V);
		for(int i=1;i<=n;i++){
			scanf("%d%d%d",&a[i].d,&a[i].v,&a[i].a);
		}
		for(int i=1;i<=m;i++){
			scanf("%d",&b[i]);
		}
		sort(b+1,b+1+n);
		for(int i=1;i<=n;i++){
			if(a[i].v<=V&&a[i].a<=0) continue;
			if(a[i].v>V&&a[i].a>=0){
				c[++w].l=a[i].d;
				c[w].r=L;
				if(work(c[w].l,c[w].r)==false){
					w--;
				}
			}
			if(a[i].v>V&&a[i].a<0){
				x=(V*V-a[i].v*a[i].v)/(2*a[i].a);
				c[++w].l=a[i].d;
				c[w].r=min(L,a[i].d+x);
				if(work(c[w].l,c[w].r)==false){
					w--;
				}
			}
			if(a[i].v<=V&&a[i].a>0){
				x=(V*V-a[i].v*a[i].v)/(2*a[i].a);
				if(a[i].d+x>L) continue;
				c[++w].l=a[i].d+x;
				c[w].r=L;
				if(work(c[w].l,c[w].r)==false){
					w--;
				}
			}
		}
		printf("%d%d",w,w);
		//sort(c+1,c+1+w,bdx);
		//for(int i=1;i<=m;i++){
			
		//}
	}
	return 0;	
}
